/**
 * 隐私协议管理工具
 * 统一处理微信小程序隐私权限检查和授权
 */

/**
 * 检查隐私协议授权状态
 * @returns {Promise<boolean>} 是否已授权
 */
export function checkPrivacyAuthorization() {
  return new Promise((resolve, reject) => {
    // 检查是否支持隐私协议API
    if (uni.getPrivacySetting) {
      uni.getPrivacySetting({
        success: (res) => {
          console.log('隐私设置状态:', res)
          // needAuthorization: true 表示需要用户授权
          resolve(!res.needAuthorization)
        },
        fail: (err) => {
          console.error('获取隐私设置失败:', err)
          // 获取失败时假设已授权（兼容旧版本）
          resolve(true)
        }
      })
    } else {
      // 不支持隐私协议API，假设已授权
      resolve(true)
    }
  })
}

/**
 * 请求隐私协议授权
 * @returns {Promise<boolean>} 授权是否成功
 */
export function requirePrivacyAuthorization() {
  return new Promise((resolve, reject) => {
    if (uni.requirePrivacyAuthorize) {
      uni.requirePrivacyAuthorize({
        success: () => {
          console.log('隐私协议授权成功')
          resolve(true)
        },
        fail: (err) => {
          console.error('隐私协议授权失败:', err)
          reject(err)
        }
      })
    } else {
      // 不支持隐私协议API，直接返回成功
      resolve(true)
    }
  })
}

/**
 * 检查并请求隐私协议授权
 * @param {Object} options 配置选项
 * @param {string} options.title 提示标题
 * @param {string} options.content 提示内容
 * @returns {Promise<boolean>} 授权是否成功
 */
export function checkAndRequirePrivacy(options = {}) {
  const defaultOptions = {
    title: '提示',
    content: '需要您同意隐私协议才能使用该功能'
  }
  const config = { ...defaultOptions, ...options }
  
  return new Promise((resolve, reject) => {
    checkPrivacyAuthorization()
      .then(isAuthorized => {
        if (isAuthorized) {
          // 已授权，直接返回成功
          resolve(true)
        } else {
          // 需要授权
          requirePrivacyAuthorization()
            .then(() => {
              resolve(true)
            })
            .catch(err => {
              // 授权失败，显示提示
              uni.showModal({
                title: config.title,
                content: config.content,
                showCancel: false,
                confirmText: '知道了'
              })
              reject(err)
            })
        }
      })
      .catch(reject)
  })
}

/**
 * 安全地调用需要位置权限的API
 * @param {Function} apiCall API调用函数
 * @param {Object} options 配置选项
 * @returns {Promise} API调用结果
 */
export function safeLocationAPI(apiCall, options = {}) {
  return new Promise((resolve, reject) => {
    checkAndRequirePrivacy({
      title: '位置权限',
      content: '需要您同意隐私协议才能使用定位功能',
      ...options
    })
      .then(() => {
        // 隐私协议已授权，调用API
        return apiCall()
      })
      .then(resolve)
      .catch(reject)
  })
}

/**
 * 安全地获取位置信息
 * @param {Object} locationOptions uni.getLocation的参数
 * @returns {Promise} 位置信息
 */
export function safeGetLocation(locationOptions = {}) {
  const defaultOptions = {
    type: 'gcj02',
    ...locationOptions
  }
  
  return safeLocationAPI(() => {
    return new Promise((resolve, reject) => {
      uni.getLocation({
        ...defaultOptions,
        success: resolve,
        fail: (err) => {
          let errorMsg = '获取位置失败'
          
          // 根据错误类型给出具体提示
          if (err.errMsg && err.errMsg.includes('auth deny')) {
            errorMsg = '位置权限被拒绝，请在设置中开启位置权限'
          } else if (err.errMsg && err.errMsg.includes('privacy agreement')) {
            errorMsg = '请先同意隐私协议'
          }
          
          const error = new Error(errorMsg)
          error.originalError = err
          reject(error)
        }
      })
    })
  })
}

/**
 * 安全地选择位置
 * @param {Object} chooseOptions uni.chooseLocation的参数
 * @returns {Promise} 选择的位置信息
 */
export function safeChooseLocation(chooseOptions = {}) {
  return safeLocationAPI(() => {
    return new Promise((resolve, reject) => {
      uni.chooseLocation({
        ...chooseOptions,
        success: resolve,
        fail: reject
      })
    })
  })
}

/**
 * 获取隐私协议授权状态的缓存
 */
export function getPrivacyCache() {
  try {
    return uni.getStorageSync('privacyAgreed') || false
  } catch (e) {
    return false
  }
}

/**
 * 设置隐私协议授权状态的缓存
 * @param {boolean} agreed 是否同意
 */
export function setPrivacyCache(agreed) {
  try {
    uni.setStorageSync('privacyAgreed', agreed)
  } catch (e) {
    console.error('保存隐私协议状态失败:', e)
  }
}

export default {
  checkPrivacyAuthorization,
  requirePrivacyAuthorization,
  checkAndRequirePrivacy,
  safeLocationAPI,
  safeGetLocation,
  safeChooseLocation,
  getPrivacyCache,
  setPrivacyCache
} 